package com.eedi.framework.template.convert;

import cn.hutool.core.collection.CollUtil;
import com.eedi.framework.template.controller.sys.vo.menu.SysTemplateMenuResp;
import com.eedi.framework.template.controller.sys.vo.menu.SysTemplateMenuSimpleResp;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;

import java.util.*;

import static com.eedi.framework.common.util.collection.CollectionUtils.filterList;
import static com.eedi.framework.template.dal.dataobject.SysTemplateMenuDO.SYS_ID_ROOT;

/**
 * @author zybourn
 */
@Mapper
public interface SysTemplateMenuConvert {
    SysTemplateMenuConvert INSTANCE = Mappers.getMapper(SysTemplateMenuConvert.class);


    SysTemplateMenuSimpleResp convert(SysTemplateMenuResp resp);
    /**
     * 将菜单列表，构建成菜单树
     *
     * @param menuList 菜单列表
     * @return 菜单树
     */
    default List<SysTemplateMenuSimpleResp> buildMenuSimpleTree(List<SysTemplateMenuSimpleResp> menuList) {
        if (CollUtil.isEmpty(menuList)) {
            return Collections.emptyList();
        }
        // 移除按钮
//        menuList.removeIf(menu -> menu.getSysMenuType().equals(SysMenuTypeEnum.BUTTON));
        // 排序，保证菜单的有序性
        menuList.sort(Comparator.comparing(SysTemplateMenuSimpleResp::getSysMenuSort));
        // 构建菜单树
        // 使用 LinkedHashMap 的原因，是为了排序 。实际也可以用 Stream API ，就是太丑了。
        Map<String, SysTemplateMenuSimpleResp> treeNodeMap = new LinkedHashMap<>();
        menuList.forEach(menu -> treeNodeMap.put(menu.getSysTemplateMenuId(), menu));
        // 处理父子关系
        treeNodeMap.values().stream().filter(node -> !node.getParentSysMenuId().equals(SYS_ID_ROOT)).forEach(childNode -> {
            // 获得父节点
            SysTemplateMenuSimpleResp parentNode = treeNodeMap.get(childNode.getParentSysMenuId());
            if (parentNode == null) {
                return;
            }
            // 将自己添加到父节点中
            if (parentNode.getChildren() == null) {
                parentNode.setChildren(new ArrayList<>());
            }
            parentNode.getChildren().add(childNode);
        });
        // 获得到所有的根节点
        return filterList(treeNodeMap.values(), node -> SYS_ID_ROOT.equals(node.getParentSysMenuId()));
    }

    /**
     * 将菜单列表，构建成菜单树
     *
     * @param menuList 菜单列表
     * @return 菜单树
     */
    default List<SysTemplateMenuResp> buildMenuTree(List<SysTemplateMenuResp> menuList) {
        if (CollUtil.isEmpty(menuList)) {
            return Collections.emptyList();
        }
        // 移除按钮
//        menuList.removeIf(menu -> menu.getSysMenuType().equals(SysMenuTypeEnum.BUTTON));
        // 排序，保证菜单的有序性
        menuList.sort(Comparator.comparing(SysTemplateMenuResp::getSysMenuSort));
        // 构建菜单树
        // 使用 LinkedHashMap 的原因，是为了排序 。实际也可以用 Stream API ，就是太丑了。
        Map<String, SysTemplateMenuResp> treeNodeMap = new LinkedHashMap<>();
        menuList.forEach(menu -> treeNodeMap.put(menu.getSysTemplateMenuId(), menu));
        // 处理父子关系
        treeNodeMap.values().stream().filter(node -> !node.getParentSysMenuId().equals(SYS_ID_ROOT)).forEach(childNode -> {
            // 获得父节点
            SysTemplateMenuResp parentNode = treeNodeMap.get(childNode.getParentSysMenuId());
            if (parentNode == null) {
                return;
            }
            // 将自己添加到父节点中
            if (parentNode.getChildren() == null) {
                parentNode.setChildren(new ArrayList<>());
            }
            parentNode.getChildren().add(childNode);
        });
        // 获得到所有的根节点
        return filterList(treeNodeMap.values(), node -> SYS_ID_ROOT.equals(node.getParentSysMenuId()));
    }
}
